package com.example.wac.service;

import com.example.wac.entity.common.ReqDTO;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author wuancheng
 * @description
 * @date 2022-07-25 15:34:00
 */

public interface WeChatService {

    /**
     * 微信接口配置验证。<br/>
     * 1）将token、timestamp、nonce三个参数进行字典序排序<br/>
     * 2）将三个参数字符串拼接成一个字符串进行sha1加密<br/>
     * 3）开发者获得加密后的字符串可与signature对比<br/>
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
     *
     * @param signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @return true-此次GET请求来自微信服务器；false-此次GET请求不是来自微信服务器
     */
    boolean checkSignature(String signature, String timestamp, String nonce);

    /**
     * 获取access_token
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
     *
     * @return access token就是微信公众号自己的core_token
     */
    String getAccessToken();

    /**
     * 获取微信用户信息(UnionID机制)<br/>
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
     *
     * @param openid
     * @return
     */
    Map<String, Object> getWeChatUserInfo(String openid);

    /**
     * 根据微信code，换取网页授权accessToken和openid
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0
     *
     * @param wxCode 微信code
     * @return 网页授权accessToken和openid等相关信息  access token就是用户自己的user_token
     */
    Map<String, Object> getAccessInfoByWxCode(String wxCode);

    /**
     * 获取用户基本信息（不包括手机号） 用户授权
     * 公众号直接获取不行 ，小程序才好获取手机号码。想用微信公众号直接获取手机号，要大公司才可以拿到授权，小公司没这个授权。
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0
     *
     * @param wxCode 微信code
     * @return 微信用户基本信息
     */
    Map<String, Object>  getWeChatUserInfoByWxCode(String wxCode);

    /**
     * 处理微信的xml消息请求
     * 详见：https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
     *
     * @param request
     * @return
     */
    String processRequest(HttpServletRequest request);

    /**
     * 微信发送模板短信
     *
     * @param dto
     */
    Map<String, Object> sendTemplateMessage(ReqDTO dto);
}
